package io.mft.commons.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import io.mft.commons.exception.MFTException;
import io.mft.commons.function.response.kv.KVMap;

public class CommonUtil {
	static Logger logger=LoggerFactory.getLogger(CommonUtil.class);
	public static KVMap jsonToKVMap(String json) {
		JSONObject jsonObject = JSONUtil.parseObj(json);
		KVMap data=jsonToKVMap(jsonObject);
		return data;
	}

	public static KVMap jsonToKVMap(JSONObject json) {
		KVMap data=new KVMap();
		data.putAll(json);
		return data;
	}

	public static Map<String, Object> objectToMap(Object obj) throws Exception {
		if (obj == null) {
			return null;
		}
		Map<String, Object> map = BeanUtil.beanToMap(obj);
		return map;
	}

	public static List<KVMap> jsonToDataList(String json) {
		JSONArray array = JSONUtil.parseArray(json);
		List<KVMap> list = new ArrayList<KVMap>();
		for (Object object : array) {
			KVMap data = jsonToKVMap((JSONObject) object);
			list.add(data);
		}
		return list;
	}

	public static <T> List<KVMap> convertToKVMap(List<T> objList) {
		List<KVMap> list = new ArrayList<KVMap>();
		for (T t : objList) {
			KVMap data = convertToKVMap(t);
			list.add(data);
		}
		return list;
	}

	public static <T> KVMap convertToKVMap(T obj) {
		try {
			Map<String, Object> map = BeanUtil.beanToMap(obj,false,true);
			KVMap data = new KVMap();
			data.putAll(map);
			return data;
		} catch (Exception e) {
			throw new MFTException("", e);
		}
	}
	
	public static <T> List<T> convertToObj(List<KVMap> dataList,Class<T> classType) {
		try {
			List<T> list=new ArrayList<T>();
			for (KVMap KVMap : dataList) {
				T obj=ReflectUtil.newInstance(classType);
				obj=BeanUtil.fillBeanWithMap(KVMap, obj, true, false);
				list.add(obj);
			}
			return list;
		} catch (Exception e) {
			throw new MFTException("", e);
		}
	}
	
	/**
	 * 解析类型声明的字段
	 * 
	 * @说明: TODO
	 * @方法名称: parseClassField
	 * @参数 @param classType
	 * @参数 @return
	 * @参数 @throws Exception
	 * @返回类型 List<String>
	 * @创建者: 胡常建
	 * @创建时间: 2019年5月7日 下午4:48:29
	 * @修改者: 胡常建
	 * @修改时间: 2019年5月7日 下午4:48:29
	 */
	public static List<String> parseClassField(Class<?> classType) throws Exception {
		Field[] field = classType.getDeclaredFields(); // 获取实体类的所有属性，返回Field数组
		List<String> list = new ArrayList<String>();
		for (int j = 0; j < field.length; j++) { // 遍历所有属性
			String name = field[j].getName(); // 获取属性的名字
			list.add(name);
		}
		return list;
	}
}
